package com.masnegocio.sellodigital.dao.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.masnegocio.sellodigital.comun.SelloDigitalConstantes;
import com.masnegocio.sellodigital.comun.SelloDigitalException;
import com.masnegocio.sellodigital.dao.KeyDao;

public class KeyDaoImpl implements KeyDao{
	private static final Logger logger = Logger.getLogger(KeyDaoImpl.class);
	private DataSource dataSource; 
	
	public KeyDaoImpl() throws SelloDigitalException{
		try {
			Context initCtx = new InitialContext(); //Quitar cuando se agregue Spring
			Context envCtx  = (Context) initCtx.lookup(SelloDigitalConstantes.CONTEXTO_LOOKUP); //Quitar cuando se agregue Spring
			dataSource      = (DataSource) envCtx.lookup(SelloDigitalConstantes.NOMBRE_DATA_SOURCE); //Quitar cuando se agregue Spring
		} catch (NamingException e) {
			logger.error("OCURRIO UN ERROR AL INTENTR RECUPERAR EL CONTEXTO JNDI CON NOMBRE "+SelloDigitalConstantes.NOMBRE_DATA_SOURCE + " EL ERROR ES "+e );
			throw new SelloDigitalException(e,SelloDigitalConstantes.CODIGO_ERROR_RECUPERAR_CONTEXT);
		}
	}
	

	@Override
	public String obtenerRutaKey(String rfc)throws SelloDigitalException {
		Connection connection = obtenerConection(); //Quitar cuando se agregue Spring
		Statement statement = null; //Quitar cuando se agregue Spring
		ResultSet resultSet = null; //Quitar cuando se agregue Spring
		StringBuilder query = new StringBuilder();
		query.append("select ruta from sello_digital where rfc = '").append(rfc).append("'");
		String ruta= new String();
		try {
			connection.setAutoCommit(false); //Quitar cuando se agregue Spring
			statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); //Quitar cuando se agregue Spring
			resultSet =  statement.executeQuery(query.toString()); //Quitar cuando se agregue Spring
			if(resultSet.next()){
				ruta = resultSet.getString(1); //Quitar cuando se agregue Spring
			}else{
				throw new SelloDigitalException(new Exception(),SelloDigitalConstantes.CODIGO_ERROR_RFC_SIN_RUTA);
			}
			
		} catch (SQLException e) {
			logger.error("NO FUE POSIBLE RECUPERAR UNA RUTA PARA EL RFC: "+rfc+" LA EXCEPTION ES "+e);			
			throw new SelloDigitalException(e,SelloDigitalConstantes.CODIGO_ERROR_CON_LA_BASE_DATOS);
		}finally{
			try {
				resultSet.close(); //Quitar cuando se agregue Spring
				statement.close(); //Quitar cuando se agregue Spring
				connection.close(); //Quitar cuando se agregue Spring
			} catch (SQLException e) {
				logger.error("NO FUE POSIBLE CERRAR LOS RECURSOS USADOS PARA RECUPERAR LA RUTA ASOCIADA AL RFC: "+rfc+" LA EXCEPTION ES "+e);			
			}
			
		}
		return ruta;
	}
	
	private Connection obtenerConection() throws SelloDigitalException{
		if(dataSource!=null){
			try {
				return dataSource.getConnection(); //Quitar cuando se agregue Spring
			} catch (SQLException e) {
				logger.error("NO FUE POSIBLE OBTENER UNA CONEXION A LA BASE DE DATOS LA EXCEPTION ES "+e);
				throw new SelloDigitalException(e,SelloDigitalConstantes.CODIGO_ERROR_CONEXION_BASE_DE_DATOS);
			}
		}else{
			try {
				Context initCtx = new InitialContext(); //Quitar cuando se agregue Spring
				Context envCtx  = (Context) initCtx.lookup(SelloDigitalConstantes.CONTEXTO_LOOKUP); //Quitar cuando se agregue Spring
				dataSource      = (DataSource) envCtx.lookup(SelloDigitalConstantes.NOMBRE_DATA_SOURCE); //Quitar cuando se agregue Spring
				return dataSource.getConnection(); //Quitar cuando se agregue Spring
			} catch (NamingException e) {
				logger.error("OCURRIO UN ERROR AL INTENTR RECUPERAR EL CONTEXTO JNDI CON NOMBRE "+SelloDigitalConstantes.NOMBRE_DATA_SOURCE + " EL ERROR ES "+e );
				throw new SelloDigitalException(e,SelloDigitalConstantes.CODIGO_ERROR_RECUPERAR_CONTEXT);
			} catch (SQLException e) {
				logger.error("NO FUE POSIBLE OBTENER UNA CONEXION A LA BASE DE DATOS LA EXCEPTION ES "+e);		
				throw new SelloDigitalException(e,SelloDigitalConstantes.CODIGO_ERROR_CONEXION_BASE_DE_DATOS);
			}
		}
	}

}
